#include <asm/xen/asm-xsi-offsets.h>
+#include <xen/interface/arch-ia64.h>
#define IA64_PARAVIRTUALIZED
#ifdef __ASSEMBLY__
-#define XEN_HYPER_RFI break 0x1
-#define XEN_HYPER_RSM_PSR_DT break 0x2
-#define XEN_HYPER_SSM_PSR_DT break 0x3
-#define XEN_HYPER_COVER break 0x4
-#define XEN_HYPER_ITC_D break 0x5
-#define XEN_HYPER_ITC_I break 0x6
-#define XEN_HYPER_SSM_I break 0x7
-#define XEN_HYPER_GET_IVR break 0x8
-#define XEN_HYPER_GET_TPR break 0x9
-#define XEN_HYPER_SET_TPR break 0xa
-#define XEN_HYPER_EOI break 0xb
-#define XEN_HYPER_SET_ITM break 0xc
-#define XEN_HYPER_THASH break 0xd
-#define XEN_HYPER_PTC_GA break 0xe
-#define XEN_HYPER_ITR_D break 0xf
-#define XEN_HYPER_GET_RR break 0x10
-#define XEN_HYPER_SET_RR break 0x11
-#define XEN_HYPER_SET_KR break 0x12
-#define XEN_HYPER_FC break 0x13
-#define XEN_HYPER_GET_CPUID break 0x14
-#define XEN_HYPER_GET_PMD break 0x15
-#define XEN_HYPER_GET_EFLAG break 0x16
-#define XEN_HYPER_SET_EFLAG break 0x17
+#define XEN_HYPER_RFI break HYPERPRIVOP_RFI
+#define XEN_HYPER_RSM_PSR_DT break HYPERPRIVOP_RSM_DT
+#define XEN_HYPER_SSM_PSR_DT break HYPERPRIVOP_SSM_DT
+#define XEN_HYPER_COVER break HYPERPRIVOP_COVER
+#define XEN_HYPER_ITC_D break HYPERPRIVOP_ITC_D
+#define XEN_HYPER_ITC_I break HYPERPRIVOP_ITC_I
+#define XEN_HYPER_SSM_I break HYPERPRIVOP_SSM_I
+#define XEN_HYPER_GET_IVR break HYPERPRIVOP_GET_IVR
+#define XEN_HYPER_GET_TPR break HYPERPRIVOP_GET_TPR
+#define XEN_HYPER_SET_TPR break HYPERPRIVOP_SET_TPR
+#define XEN_HYPER_EOI break HYPERPRIVOP_EOI
+#define XEN_HYPER_SET_ITM break HYPERPRIVOP_SET_ITM
+#define XEN_HYPER_THASH break HYPERPRIVOP_THASH
+#define XEN_HYPER_PTC_GA break HYPERPRIVOP_PTC_GA
+#define XEN_HYPER_ITR_D break HYPERPRIVOP_ITR_D
+#define XEN_HYPER_GET_RR break HYPERPRIVOP_GET_RR
+#define XEN_HYPER_SET_RR break HYPERPRIVOP_SET_RR
+#define XEN_HYPER_SET_KR break HYPERPRIVOP_SET_KR
+#define XEN_HYPER_FC break HYPERPRIVOP_FC
+#define XEN_HYPER_GET_CPUID break HYPERPRIVOP_GET_CPUID
+#define XEN_HYPER_GET_PMD break HYPERPRIVOP_GET_PMD
+#define XEN_HYPER_GET_EFLAG break HYPERPRIVOP_GET_EFLAG
+#define XEN_HYPER_SET_EFLAG break HYPERPRIVOP_SET_EFLAG
#endif
#ifndef __ASSEMBLY__
extern int running_on_xen;
#endif
-#define XEN_HYPER_SSM_I asm("break 0x7");
-#define XEN_HYPER_GET_IVR asm("break 0x8");
+#define XEN_HYPER_SSM_I asm("break %0" : : "i" (HYPERPRIVOP_SSM_I))
+#define XEN_HYPER_GET_IVR asm("break %0" : : "i" (HYPERPRIVOP_GET_IVR))
/************************************************/
/* Instructions paravirtualized for correctness */
#undef RFI_TO_INTERRUPT // not working yet
#endif
-#define XEN_HYPER_RFI 0x1
-#define XEN_HYPER_RSM_DT 0x2
-#define XEN_HYPER_SSM_DT 0x3
-#define XEN_HYPER_COVER 0x4
-#define XEN_HYPER_ITC_D 0x5
-#define XEN_HYPER_ITC_I 0x6
-#define XEN_HYPER_SSM_I 0x7
-#define XEN_HYPER_GET_IVR 0x8
-#define XEN_HYPER_GET_TPR 0x9
-#define XEN_HYPER_SET_TPR 0xa
-#define XEN_HYPER_EOI 0xb
-#define XEN_HYPER_SET_ITM 0xc
-#define XEN_HYPER_THASH 0xd
-#define XEN_HYPER_PTC_GA 0xe
-#define XEN_HYPER_ITR_D 0xf
-#define XEN_HYPER_GET_RR 0x10
-#define XEN_HYPER_SET_RR 0x11
-#define XEN_HYPER_SET_KR 0x12
-
#ifdef CONFIG_SMP
#warning "FIXME: ptc.ga instruction requires spinlock for SMP"
#undef FAST_PTC_GA
#endif
// HYPERPRIVOP_SSM_I?
// assumes domain interrupts pending, so just do it
- cmp.eq p7,p6=XEN_HYPER_SSM_I,r17
+ cmp.eq p7,p6=HYPERPRIVOP_SSM_I,r17
(p7) br.sptk.many hyper_ssm_i;;
// FIXME. This algorithm gives up (goes to the slow path) if there
1: // when we get to here r20=~=interrupts pending
// HYPERPRIVOP_RFI?
- cmp.eq p7,p6=XEN_HYPER_RFI,r17
+ cmp.eq p7,p6=HYPERPRIVOP_RFI,r17
(p7) br.sptk.many hyper_rfi;;
// HYPERPRIVOP_GET_IVR?
- cmp.eq p7,p6=XEN_HYPER_GET_IVR,r17
+ cmp.eq p7,p6=HYPERPRIVOP_GET_IVR,r17
(p7) br.sptk.many hyper_get_ivr;;
cmp.ne p7,p0=r20,r0
(p7) br.spnt.many dispatch_break_fault ;;
// HYPERPRIVOP_COVER?
- cmp.eq p7,p6=XEN_HYPER_COVER,r17
+ cmp.eq p7,p6=HYPERPRIVOP_COVER,r17
(p7) br.sptk.many hyper_cover;;
// HYPERPRIVOP_SSM_DT?
- cmp.eq p7,p6=XEN_HYPER_SSM_DT,r17
+ cmp.eq p7,p6=HYPERPRIVOP_SSM_DT,r17
(p7) br.sptk.many hyper_ssm_dt;;
// HYPERPRIVOP_RSM_DT?
- cmp.eq p7,p6=XEN_HYPER_RSM_DT,r17
+ cmp.eq p7,p6=HYPERPRIVOP_RSM_DT,r17
(p7) br.sptk.many hyper_rsm_dt;;
// HYPERPRIVOP_GET_TPR?
- cmp.eq p7,p6=XEN_HYPER_GET_TPR,r17
+ cmp.eq p7,p6=HYPERPRIVOP_GET_TPR,r17
(p7) br.sptk.many hyper_get_tpr;;
// HYPERPRIVOP_SET_TPR?
- cmp.eq p7,p6=XEN_HYPER_SET_TPR,r17
+ cmp.eq p7,p6=HYPERPRIVOP_SET_TPR,r17
(p7) br.sptk.many hyper_set_tpr;;
// HYPERPRIVOP_EOI?
- cmp.eq p7,p6=XEN_HYPER_EOI,r17
+ cmp.eq p7,p6=HYPERPRIVOP_EOI,r17
(p7) br.sptk.many hyper_eoi;;
// HYPERPRIVOP_SET_ITM?
- cmp.eq p7,p6=XEN_HYPER_SET_ITM,r17
+ cmp.eq p7,p6=HYPERPRIVOP_SET_ITM,r17
(p7) br.sptk.many hyper_set_itm;;
// HYPERPRIVOP_SET_RR?
- cmp.eq p7,p6=XEN_HYPER_SET_RR,r17
+ cmp.eq p7,p6=HYPERPRIVOP_SET_RR,r17
(p7) br.sptk.many hyper_set_rr;;
// HYPERPRIVOP_GET_RR?
- cmp.eq p7,p6=XEN_HYPER_GET_RR,r17
+ cmp.eq p7,p6=HYPERPRIVOP_GET_RR,r17
(p7) br.sptk.many hyper_get_rr;;
// HYPERPRIVOP_PTC_GA?
- cmp.eq p7,p6=XEN_HYPER_PTC_GA,r17
+ cmp.eq p7,p6=HYPERPRIVOP_PTC_GA,r17
(p7) br.sptk.many hyper_ptc_ga;;
// HYPERPRIVOP_ITC_D?
- cmp.eq p7,p6=XEN_HYPER_ITC_D,r17
+ cmp.eq p7,p6=HYPERPRIVOP_ITC_D,r17
(p7) br.sptk.many hyper_itc_d;;
// HYPERPRIVOP_ITC_I?
- cmp.eq p7,p6=XEN_HYPER_ITC_I,r17
+ cmp.eq p7,p6=HYPERPRIVOP_ITC_I,r17
(p7) br.sptk.many hyper_itc_i;;
// HYPERPRIVOP_THASH?
- cmp.eq p7,p6=XEN_HYPER_THASH,r17
+ cmp.eq p7,p6=HYPERPRIVOP_THASH,r17
(p7) br.sptk.many hyper_thash;;
// HYPERPRIVOP_SET_KR?
- cmp.eq p7,p6=XEN_HYPER_SET_KR,r17
+ cmp.eq p7,p6=HYPERPRIVOP_SET_KR,r17
(p7) br.sptk.many hyper_set_kr;;
// if not one of the above, give up for now and do it the slow way
cmp.ne p7,p0=r21,r0
(p7) br.sptk.many dispatch_break_fault ;;
#ifdef FAST_HYPERPRIVOP_CNT
- movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_SSM_I);;
+ movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_SSM_I);;
ld8 r21=[r20];;
adds r21=1,r21;;
st8 [r20]=r21;;
1: // OK now, let's do an rfi.
#ifdef FAST_HYPERPRIVOP_CNT
- movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_RFI);;
+ movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_RFI);;
ld8 r23=[r20];;
adds r23=1,r23;;
st8 [r20]=r23;;
ENTRY(hyper_cover)
#ifdef FAST_HYPERPRIVOP_CNT
- movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_COVER);;
+ movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_COVER);;
ld8 r21=[r20];;
adds r21=1,r21;;
st8 [r20]=r21;;
// return from metaphysical mode (meta=1) to virtual mode (meta=0)
ENTRY(hyper_ssm_dt)
#ifdef FAST_HYPERPRIVOP_CNT
- movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_SSM_DT);;
+ movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_SSM_DT);;
ld8 r21=[r20];;
adds r21=1,r21;;
st8 [r20]=r21;;
// go to metaphysical mode (meta=1) from virtual mode (meta=0)
ENTRY(hyper_rsm_dt)
#ifdef FAST_HYPERPRIVOP_CNT
- movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_RSM_DT);;
+ movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_RSM_DT);;
ld8 r21=[r20];;
adds r21=1,r21;;
st8 [r20]=r21;;
ENTRY(hyper_get_tpr)
#ifdef FAST_HYPERPRIVOP_CNT
- movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_GET_TPR);;
+ movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_GET_TPR);;
ld8 r21=[r20];;
adds r21=1,r21;;
st8 [r20]=r21;;
// (or accidentally missing) delivering an interrupt
ENTRY(hyper_set_tpr)
#ifdef FAST_HYPERPRIVOP_CNT
- movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_SET_TPR);;
+ movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_SET_TPR);;
ld8 r21=[r20];;
adds r21=1,r21;;
st8 [r20]=r21;;
ENTRY(hyper_get_ivr)
#ifdef FAST_HYPERPRIVOP_CNT
- movl r22=fast_hyperpriv_cnt+(8*XEN_HYPER_GET_IVR);;
+ movl r22=fast_hyperpriv_cnt+(8*HYPERPRIVOP_GET_IVR);;
ld8 r21=[r22];;
adds r21=1,r21;;
st8 [r22]=r21;;
cmp.ne p7,p0=r20,r0
(p7) br.spnt.many dispatch_break_fault ;;
#ifdef FAST_HYPERPRIVOP_CNT
- movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_EOI);;
+ movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_EOI);;
ld8 r21=[r20];;
adds r21=1,r21;;
st8 [r20]=r21;;
cmp.ne p7,p0=r20,r0
(p7) br.spnt.many dispatch_break_fault ;;
#ifdef FAST_HYPERPRIVOP_CNT
- movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_SET_ITM);;
+ movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_SET_ITM);;
ld8 r21=[r20];;
adds r21=1,r21;;
st8 [r20]=r21;;
ENTRY(hyper_get_rr)
#ifdef FAST_HYPERPRIVOP_CNT
- movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_GET_RR);;
+ movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_GET_RR);;
ld8 r21=[r20];;
adds r21=1,r21;;
st8 [r20]=r21;;
cmp.leu p7,p0=7,r25 // punt on setting rr7
(p7) br.spnt.many dispatch_break_fault ;;
#ifdef FAST_HYPERPRIVOP_CNT
- movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_SET_RR);;
+ movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_SET_RR);;
ld8 r21=[r20];;
adds r21=1,r21;;
st8 [r20]=r21;;
cmp.ne p7,p0=r0,r25 // if kr# > 7, go slow way
(p7) br.spnt.many dispatch_break_fault ;;
#ifdef FAST_HYPERPRIVOP_CNT
- movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_SET_KR);;
+ movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_SET_KR);;
ld8 r21=[r20];;
adds r21=1,r21;;
st8 [r20]=r21;;
// r31 == pr
GLOBAL_ENTRY(hyper_thash)
#ifdef FAST_HYPERPRIVOP_CNT
- movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_THASH);;
+ movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_THASH);;
ld8 r21=[r20];;
adds r21=1,r21;;
st8 [r20]=r21;;
#endif
// FIXME: validate not flushing Xen addresses
#ifdef FAST_HYPERPRIVOP_CNT
- movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_PTC_GA);;
+ movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_PTC_GA);;
ld8 r21=[r20];;
adds r21=1,r21;;
st8 [r20]=r21;;
br.sptk.many dispatch_break_fault;;
// Registers at entry
-// r17 = break immediate (XEN_HYPER_ITC_D or I)
+// r17 = break immediate (HYPERPRIVOP_ITC_D or I)
// r18 == XSI_PSR_IC_OFS
// r31 == pr
GLOBAL_ENTRY(hyper_itc)
cmp.ne p7,p0=r27,r28
(p7) br.spnt.many dispatch_break_fault ;;
#ifdef FAST_HYPERPRIVOP_CNT
- cmp.eq p6,p7=XEN_HYPER_ITC_D,r17;;
-(p6) movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_ITC_D);;
-(p7) movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_ITC_I);;
+ cmp.eq p6,p7=HYPERPRIVOP_ITC_D,r17;;
+(p6) movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_ITC_D);;
+(p7) movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_ITC_I);;
ld8 r21=[r20];;
adds r21=1,r21;;
st8 [r20]=r21;;